package br.fic.poo.agenda.main;

import javax.swing.JOptionPane;
import br.fic.poo.agenda.classes.*;
import br.fic.poo.agenda.persistencia.*;
import java.util.*;

public class AgendaModeloMain 
{ 
	public static void main(String[] args) 
	{
		Agenda agenda = Agenda.getAgenda();
                Contato contatoAux;
                Compromisso compromissoAux;
                GregorianCalendar gc;
                boolean teste;
                
                ContatoDAO daoContato = new ContatoDAO();
                //CompromissoDAO daoCompromisso = new CompromissoDAO();

                int opcao = 0;

                agenda.lerAgenda();
		
                lerProprietarioAgenda(agenda);
		
		String opcoes = 
		  "Estácio | FIC - Programação Orientada a Objetos\n"+
		  "< Agenda de Contatos e Compromissos - 2013 >"+
		  "\n\n*** Opções *** "+
		  "\n1. Contatos"+
		  "\n2. Compromissos"+
		  "\n3. Listar Contatos"+
		  "\n4. Listar Compromissos"+
		  "\n5. Proprietário da Agenda"+
		  "\n6. Informações da Agenda"+
		  "\n7. Finalizar"+
		  "\n\nSelecione a opção desejada: ";

		while (opcao != 7) 
		{
                    try 
                    {
                        opcao = Integer.parseInt(JOptionPane.showInputDialog(null, opcoes,
                                "Agenda de " + agenda.getProprietario(), JOptionPane.QUESTION_MESSAGE));
                    }
                    catch (Exception e) 
                    { opcao = 0; }
		
			switch(opcao)
			{
			  case 1:
                              contatoAux = new Contato();
                              lerContato(contatoAux);
                              teste = true;
                              try {  daoContato.incluir(contatoAux);  }
                              catch ( Exception e) {
                                    JOptionPane.showMessageDialog(null, e.getMessage());
                                    teste = false;
                              }
                              if (teste)
                                    JOptionPane.showMessageDialog(null, "Contato Cadastrado com Sucesso!");
                              break;
			  case 2:
				// Implementar
				break;
			  case 3:
                                StringBuffer lista = new StringBuffer();
                                lista.append("Lista de Contatos Cadastrados:\n\n");
                                for (Contato contato : daoContato.consultar())
                                {
                                    lista.append(dadosContato(contato));
                                    lista.append("-----\n");
                                }
                                lista.append("\nTotal: " + daoContato.consultar().size() + " contato(s)");
                                JOptionPane.showMessageDialog(null, lista.toString());
                                break;
			  case 4:
				// Implementar
				break;
			  case 5:
				// Implementar
				break;
			  case 6:
				// Implementar
				break;
			  case 7:
				if (JOptionPane.showConfirmDialog(null, 
                                        "Confirma a Saída da Agenda ?",
                                        "Confirmação",
                                        JOptionPane.YES_NO_CANCEL_OPTION,
                                        JOptionPane.QUESTION_MESSAGE)
                                        != JOptionPane.YES_OPTION)
                                {
                                    opcao = 0;
                                }
                                agenda.gravarAgenda();
				break;
                          default:
                                JOptionPane.showMessageDialog(null, "Opção Inválida!");
			}
            }
            System.out.println("# Fim do Programa #");
            System.out.println("bye...");
	}
        
        private static void lerProprietarioAgenda(Agenda ag)
        {
            ag.setProprietario(JOptionPane.showInputDialog( "Proprietário da Agenda:",
                    ag.getProprietario()));
            ag.setEmail(JOptionPane.showInputDialog("Email do Proprietário:",
                    ag.getEmail()));
            ag.setTelefone(JOptionPane.showInputDialog("Telefone do Proprietário:",
                    ag.getTelefone()));
        }
	
	private static Contato lerContato(Contato c)
	{
            c.setNome(JOptionPane.showInputDialog("Nome do Contato:",
                    c.getNome()));
            c.setSobrenome(JOptionPane.showInputDialog("Sobrenome:",
                    c.getSobrenome()));

            c.setTipo(lerTipoContato(c.getTipo()));
            
            c.setTelefone(JOptionPane.showInputDialog("Telefone:",
                    c.getTelefone()));
            c.setEmail(JOptionPane.showInputDialog("Email:",
                    c.getEmail()));
            
            c.setAniversario(lerData(c.getAniversario()));
            
            return c;
        }
        
        private static ETipoContato lerTipoContato(ETipoContato tipo)
        {
            ETipoContato novoTipo;
            String strTipo = "";
            if (tipo != null) {
                switch (tipo) {
                    case AMIGO:     strTipo = "1";  break;
                    case FAMILIA:   strTipo = "2";  break;
                    case FACULDADE: strTipo = "3";  break;
                    case TRABALHO:  strTipo = "4";  break;
                    case OUTRO:     strTipo = "5";  break;
                }
            }
            
            strTipo = JOptionPane.showInputDialog("Tipo do Contato:\n"+
                    "1 - Amigo(a)\n2 - Família\n3 - Faculdade\n"+
                    "4 - Trabalho\n5 - Outros", strTipo);
            
            switch(strTipo)
            {
                case "1": novoTipo = ETipoContato.AMIGO; break;
                case "2": novoTipo = ETipoContato.FAMILIA; break;
                case "3": novoTipo = ETipoContato.FACULDADE; break;
                case "4": novoTipo = ETipoContato.TRABALHO; break;
                case "5": novoTipo = ETipoContato.OUTRO; break;
                default:  novoTipo = ETipoContato.OUTRO;
            }
            return novoTipo;
        }
        
        private static GregorianCalendar lerData(GregorianCalendar data)
        {
            GregorianCalendar novaData = new GregorianCalendar();
            String strData = "";
            int dia, mes, ano;
            String dt[];
            
            if (data != null)
            {
                strData = formatoData(data);
            }
            
            strData = JOptionPane.showInputDialog("Data de Aniversário:\n"+
                    "Utilize o formato: DD/MM/AAAA",
                    strData);        
            
            dt = strData.split("/");
            dia = Integer.parseInt(dt[0]);
            mes = Integer.parseInt(dt[1]);
            ano = Integer.parseInt(dt[2]);
            novaData.set(ano, mes, dia);
            
            return novaData;
        }
        
        private static String dadosContato(Contato c)
        {
            return "Contato: Id=" + c.getId() + "  Tipo=" + c.getTipo() +
                    "\nNome: " + c.getNome() + " " + c.getSobrenome() +
                    "\nTelefone: "+c.getTelefone() +
                    "\nEmail: "+c.getEmail() +
                    "\nAniversário: "+formatoData(c.getAniversario()) +
                    "\n";
        }
        
        private static String formatoData(GregorianCalendar dt)
        {
            return String.format("%02d/%02d/%04d",
                        dt.get(GregorianCalendar.DAY_OF_MONTH),
                        dt.get(GregorianCalendar.MONTH),
                        dt.get(GregorianCalendar.YEAR));
        }
        
	private static Compromisso lerCompromisso(Compromisso c)
	{
            return null;
        }

}

// Fim do Programa
